/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package apshibernate;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author SUPORTE2
 */
public class ClienteTableModel extends AbstractTableModel {
    //constantes que vão representar as colunas
    //(só para facilitar o entendimento do código)

    private final int COL_ID = 0;
    private final int COL_NOME = 1;
    private final int COL_IDADE = 2;
    private final int COL_EMAIL = 3;
    private final int COL_FONE = 4;
    //lista dos produtos que serão exibidos
    private List<Cliente> clientes;

    public ClienteTableModel() {
        clientes = new ArrayList();
    }

    public ClienteTableModel(List<Cliente> lista) {
        this();
        clientes.addAll(lista);
    }

    public int getRowCount() {
        //cada produto na lista será uma linha
        return clientes.size();
    }

    public int getColumnCount() {
        //vamos exibir só Nome e Quantidade, então são 2 colunas
        return 5;
    }

    @Override
    public String getColumnName(int column) {
        //qual o nome da coluna
        if (column == COL_ID) {
            return "ID";
        } else if (column == COL_NOME) {
            return "Nome";
        } else if (column == COL_IDADE) {
            return "Idade";
        } else if (column == COL_EMAIL) {
            return "Email";
        } else if (column == COL_FONE) {
            return "Fone";
        }
        return "";
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        //retorna a classe que representa a coluna
        if (columnIndex == COL_ID) {
            return Integer.class;
        } else if (columnIndex == COL_NOME) {
            return String.class;
        } else if (columnIndex == COL_IDADE) {
            return Integer.class;
        } else if (columnIndex == COL_EMAIL) {
            return String.class;
        } else if (columnIndex == COL_FONE) {
            return String.class;
        }
        return String.class;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        //pega o produto da linha
        Cliente c = clientes.get(rowIndex);

        //verifica qual valor deve ser retornado
        if (columnIndex == COL_ID) {
            return c.getId();
        } else if (columnIndex == COL_NOME) {
            return c.getNome();
        } else if (columnIndex == COL_IDADE) {
            return c.getIdade();
        } else if (columnIndex == COL_EMAIL) {
            return c.getEmail();
        } else if (columnIndex == COL_FONE) {
            return c.getFone();
        }
        return "";
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //pega o produto da linha
        Cliente c = clientes.get(rowIndex);

        //verifica qual valor vai ser alterado
        if (columnIndex == COL_ID) {
            c.setId(Integer.parseInt(aValue.toString()));
        } else if (columnIndex == COL_NOME) {
            c.setNome(aValue.toString());
        } else if (columnIndex == COL_IDADE) {
            c.setIdade(Integer.parseInt(aValue.toString()));
        } else if (columnIndex == COL_EMAIL) {
            c.setEmail(aValue.toString());
        } else if (columnIndex == COL_FONE) {
            c.setFone(aValue.toString());
        }

        //avisa que os dados mudaram
        fireTableDataChanged();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas
        return true;
    }

    public void inserir(Cliente c) {
        clientes.add(c);

        fireTableDataChanged();
    }

    public void excluir(int pos) {
        clientes.remove(pos);
        fireTableDataChanged();
    }
    
    public void excluir (Cliente c){
        clientes.remove(c);
         fireTableDataChanged();
    }
    
    public void ordenarPorNome() {
        //ordena pelo nome
        Collections.sort(clientes, new Comparator<Cliente>() {
 
            public int compare(Cliente o1, Cliente o2) {
                return o1.getNome().compareTo(o2.getNome());
            }
        });
 
        //avisa que a tabela foi alterada
        fireTableDataChanged();
    }
    
    public Cliente getCliente(int pos) {
        if (pos < 0 || pos >= clientes.size()) {
            return null;
        }
 
        return clientes.get(pos);
    }
}
